/*
 * Copyright (C) 2017 zhouyou(478319399@qq.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.shuyihui.rxhttp.callback

import com.google.gson.internal.`$Gson$Types`
import com.shuyihui.rxhttp.model.ApiResult
import com.shuyihui.rxhttp.utils.Utils
import okhttp3.ResponseBody
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

/**
 *
 * 描述：提供Clazz回调代理
 * 主要用于可以自定义ApiResult<br></br>
 */
abstract class CallClazzProxy<T : ApiResult<R>?, R>(
    val callType: Type?
) : IType<T> {
    override val type: Type?
        get() = let {
            var typeArguments: Type? = null
            if (callType != null) {
                typeArguments = callType
            }
            if (typeArguments == null) {
                typeArguments = ResponseBody::class.java
            }
            var rawType = Utils.findNeedType(javaClass)
            if (rawType is ParameterizedType) {
                rawType = rawType.rawType
            }
            `$Gson$Types`.newParameterizedTypeWithOwner(null, rawType, typeArguments)
        }
/*override fun getType(): Type { //CallClazz代理方式，获取需要解析的Type
        var typeArguments: Type? = null
        if (callType != null) {
            typeArguments = callType
        }
        if (typeArguments == null) {
            typeArguments = ResponseBody::class.java
        }
        var rawType = Utils.findNeedType(javaClass)
        if (rawType is ParameterizedType) {
            rawType = rawType.rawType
        }
        return `$Gson$Types`.newParameterizedTypeWithOwner(null, rawType, typeArguments)
    }*/
}